#include "cmesa.h"

CMesa::CMesa(QObject *parent) :
    QObject(parent)
{
    _tipoJogo = E_1x1;
    _tipoBaralho = E_Baralho_Limpo;
    _carta1 = NULL;
    _carta2 = NULL;
    _carta3 = NULL;
    _carta4 = NULL;
    _manilha = NULL;
    this->MontarBaralho();
}

CCarta * CMesa::getCarta1()
{
    return _carta1;
}

CCarta * CMesa::getCarta2()
{
    return _carta2;
}

CCarta * CMesa::getCarta3()
{
    return _carta3;
}

CCarta * CMesa::getCarta4()
{
    return _carta4;
}

CCarta * CMesa::getManilha()
{
    return _manilha;
}

void CMesa::setCarta1(CCarta *c)
{
    _carta1 = c;
    emit carta1Changed();
}

void CMesa::setCarta2(CCarta *c)
{
    _carta2 = c;
    emit carta2Changed();
}

void CMesa::setCarta3(CCarta *c)
{
    _carta3 = c;
    emit carta3Changed();
}

void CMesa::setCarta4(CCarta *c)
{
    _carta4 = c;
    emit carta4Changed();
}

void CMesa::setManilha(CCarta *c)
{
    _manilha = c;
    emit manilhaChanged();
}

void CMesa::LimparMesa()
{
    if (_carta1)
        _carta1->setStatusCarta(CCarta::E_Status_NoBaralho);
    if (_carta2)
        _carta2->setStatusCarta(CCarta::E_Status_NoBaralho);
    if (_carta3)
        _carta3->setStatusCarta(CCarta::E_Status_NoBaralho);
    if (_carta4)
        _carta4->setStatusCarta(CCarta::E_Status_NoBaralho);
    _manilha->setStatusCarta(CCarta::E_Status_NoBaralho);
    if (_tipoJogo == E_1x1) {
        _jogador1->RodadaFinalizada();
        _jogador3->RodadaFinalizada();
    } else {
        _jogador1->RodadaFinalizada();
        _jogador2->RodadaFinalizada();
        _jogador3->RodadaFinalizada();
        _jogador4->RodadaFinalizada();
    }
    _carta1 = NULL;
    _carta2 = NULL;
    _carta3 = NULL;
    _carta4 = NULL;
    _manilha = NULL;
    emit carta1Changed();
    emit carta2Changed();
    emit carta3Changed();
    emit carta4Changed();
    emit manilhaChanged();
}

CJogador * CMesa::getJogador1()
{
    return _jogador1;
}

CJogador * CMesa::getJogador2()
{
    return _jogador2;
}

CJogador * CMesa::getJogador3()
{
    return _jogador3;
}

CJogador * CMesa::getJogador4()
{
    return _jogador4;
}

CMesa::ETipoJogo CMesa::getTipoJogo()
{
    return _tipoJogo;
}

CMesa::ETipoBaralho CMesa::getTipoBaralho()
{
    return _tipoBaralho;
}

void CMesa::setTipoJogo(CMesa::ETipoJogo tipoJogo)
{
    _tipoJogo = tipoJogo;

}

void CMesa::setTipoBaralho(CMesa::ETipoBaralho tipoBaralho)
{
    _tipoBaralho = tipoBaralho;
    this->PrepararBaralho();
}

void CMesa::NovoJogo()
{
    this->PrepararBaralho();
    this->DeletarJogadores();
    this->CriarJogadores();
}

void CMesa::NovaRodada()
{
    this->LimparMesa();
}

void CMesa::PrepararBaralho()
{
    for (int i = 0; i < _cartas.count(); i++)
    {
        if (_tipoBaralho == E_Baralho_Limpo)
        {
            QString carta = _cartas.at(i)->getCarta();
            if (carta == "1" ||
                carta == "2" ||
                carta == "3" ||
                carta == "J" ||
                carta == "Q" ||
                carta == "K")
                _cartas.at(i)->setStatusCarta(CCarta::E_Status_NoBaralho);
            else
                _cartas.at(i)->setStatusCarta(CCarta::E_Status_ForaBaralho);
        }
        else
        {
            _cartas.at(i)->setStatusCarta(CCarta::E_Status_NoBaralho);
        }
    }
}

void CMesa::DeletarJogadores()
{
    if (_jogador1)
        delete _jogador1;
    if (_jogador2)
        delete _jogador2;
    if (_jogador3)
        delete _jogador3;
    if (_jogador4)
        delete _jogador4;
    _jogador1 = null;
    _jogador2 = null;
    _jogador3 = null;
    _jogador4 = null;
}

void CMesa::CriarJogadores()
{
    if (_tipoJogo == E_1x1)
    {
        _jogador1 = new CJogador(this);
        _jogador3 = new CJogador(this);
    } else
    {
        _jogador1 = new CJogador(this);
        _jogador2 = new CJogador(this);
        _jogador3 = new CJogador(this);
        _jogador4 = new CJogador(this);
    }
}

void CMesa::DistribuirCartasJogadores()
{
    if (_jogador1)
    {
        _jogador1->AdicionarCarta(this->VirarCartaQuente());
        _jogador1->AdicionarCarta(this->VirarCartaQuente());
        _jogador1->AdicionarCarta(this->VirarCartaQuente());
    }
    if (_jogador2)
    {
        _jogador2->AdicionarCarta(this->VirarCartaQuente());
        _jogador2->AdicionarCarta(this->VirarCartaQuente());
        _jogador2->AdicionarCarta(this->VirarCartaQuente());
    }
    if (_jogador3)
    {
        _jogador3->AdicionarCarta(this->VirarCartaQuente());
        _jogador3->AdicionarCarta(this->VirarCartaQuente());
        _jogador3->AdicionarCarta(this->VirarCartaQuente());
    }
    if (_jogador4)
    {
        _jogador4->AdicionarCarta(this->VirarCartaQuente());
        _jogador4->AdicionarCarta(this->VirarCartaQuente());
        _jogador4->AdicionarCarta(this->VirarCartaQuente());
    }
}

void CMesa::MontarBaralho()
{
    QString carta;
    CCarta *c1, *c2, *c3, *c4;
    for (int i = 1; i <= 13; i++)
    {
        if (i == 1)
            carta = "A";
        else if (i <= 10)
            carta = QVariant(i).toString();
        else if (i == 11)
            carta = "J";
        else if (i == 12)
            carta = "Q";
        else if (i == 13)
            carta = "K";
        c1 = new CCarta();
        c2 = new CCarta();
        c3 = new CCarta();
        c4 = new CCarta();
        c1->setCarta(carta);
        c1->setNaipe("paus");
        c1->setStatusCarta(CCarta::E_Status_NoBaralho);
        c2->setCarta(carta);
        c2->setNaipe("copas");
        c2->setStatusCarta(CCarta::E_Status_NoBaralho);
        c3->setCarta(carta);
        c3->setNaipe("espadas");
        c3->setStatusCarta(CCarta::E_Status_NoBaralho);
        c4->setCarta(carta);
        c4->setNaipe("ouros");
        c4->setStatusCarta(CCarta::E_Status_NoBaralho);
        _cartas.append(c1);
        _cartas.append(c2);
        _cartas.append(c3);
        _cartas.append(c4);
    }
}

CCarta * CMesa::VirarCartaQuente()
{
    do {
        qsrand(QDateTime::currentDateTime().toMSecsSinceEpoch());
        int n = qrand() % 13;
        CCarta *c = _cartas[n];
        if (c->getStatusCarta() & CCarta::E_Status_NoBaralho)
        {
            c->setStatusCarta(c->getStatusCarta() | CCarta::E_Status_Selecionada);
            return c;
        }
    } while (true);
}
